null這型別只有一個值就是null
那null是什麼,從字面上來說null是無效的;無價值的意思
而ECMAScript是這麼解釋的
primitive value that represents the intentional absence of any object value
null是一個primitive,是一個刻意留空的值
另外wiki-Null pointer對null是這樣敘述的
A null pointer or null reference is a value saved for indicating that the pointer or reference does not refer to a valid object.
null代表一個值,這個值指向一個無效的對象
鯊魚依據上面兩段話,得出一個結論
有一個值他叫做null,只是這個值裡面沒有任何東西,因此他不屬於其他型別
為此他獨立於其他型別之外,自己成為一個型別那就是null
undefined這型別也只有一個值就是undefined
undefined從字面上來說是未定義的
而ECMAScript是這麼解釋的
primitive value used when a variable has not been assigned a value
undefined是一個primitive,是還沒被賦予內容的值
ECMAScript說的沒錯只是MDN說的比較完善MDN-undefined
undefined is a primitive value automatically assigned to variables that have just been declared, or to formal arguments for which there are no actual arguments.
一個值只要被宣告之後就會先被自動賦予一個值undefined,或是沒有指向一個實際的值就會先回傳undefined
或許你這樣看還是一知半解,不過她有舉出很明確的例子讓你實作
宣告一個變數然後沒有賦予他值
let b
//undefined
此時就會很明確地給予變數b一個值undefined
另外沒有指向實際的值是什麼狀況,我們看看下面的例子
let c =[1,2,3]; // 宣告一個變數c並給予她一個陣列
c[0]
// 1 回傳陣列的第一個值
c[1]
// 2 回傳陣列的第二個值
c[2]
// 3 回傳陣列的第三個值
c[3]
// undefined 應該要回傳陣列的第四個值
// 但是這個陣列沒有第四個值所以是指向一個沒有東西的地方
// 所以會回傳undefined
感覺跟null很像,但是其實差很遠
null是一個值,一個很明確告訴你這個值是沒有東西的
也就是沒有東西
undefined雖然也是一個值,但是他只是現在還沒有被定義/賦值
也就是現在還沒給他值(以後會不會給不知道)
symbol是一個很微妙的型別
依據ECMAScript是這麼解釋的
primitive value that represents a unique, non-String Object property key
他是一個primitive,代表一個獨特、非字串的物體
也就是說可以透過Symbol創造出獨一無二的值
看看下面演示
Symbol("shark") === Symbol("shark")
// false
雖然他們都是shark但是透過Symbol就創造出獨一無二的shark
看起來相似但是已經是完全不同的東西了
Symbol是一種擴充語言機制,主要運用在ES6新增的for/of迴圈或是
可迭代物件(iterable objectsg)上面
因為標準化的特定字串名稱會破壞原本的程式碼
所以才使用Symbol的方式來保護程式碼不被破壞
JavaScript有八種型別,分別由七種Primitive跟一個Object組成
雖然可以用typeof 窺探她的真身,不過還是有一些特例(typeof null會回傳object 而不是null)
乍看之下七種Primitive雖然很多,但是多嘗試多運用,
就能漸漸的熟悉他們的特性,在運用上也越得心應手。
參考資料
MDN-null
ECMAScript Language Specification
wiki-Null pointer
MDN-undefined
MDN-Symbol